package hao.bk.utils;

import hao.bk.royalmap.RoyalMapActivity;
import android.app.Activity;
import android.content.res.Configuration;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;

public class ScreenUtils {

	private static final String TAG = "Royal Map";

	/** Hằng số tỉ lệ giữa chiều dài và chiều rộng của một hình chữ nhật chuẩn */
	public static final float RECT_FIBONACCI = 1.618f;

	/** chiều cao tối đa cho một dialog (70% của màn hình) */
	public static final double DIALOG_MAX_HEIGHT = (double) 0.7;

	/** Chiều rộng của dialog Danh sách Taxi */
	public static final double MAX_WIDTH_DIALOG = (double) 0.9;

	/** Chiều rộng của dialogSetting */
	public static final double WIDTH_DIALOG = (double) 0.8;
	/** cao của dialogSetting */
	public static final double HEIGHT_DIALOG = (double) 0.5;
	/** Diện tích nút hiển thị select */
	public static final double AREA_SELECT = (double) 0.06;

	/**
	 * Hằng số quy định kích thước vật lý tối thiểu của một điện thoại bình
	 * thường (inches)
	 */
	private static final float MIN_NORMAL_PHONE_SIZE = 3.5f;
	/**
	 * Hằng số quy định kích thước vật lý tối thiểu của một điện thoại
	 * lớn(inches)
	 */
	private static final float MIN_LARGE_PHONE_SIZE = 4.0f;
	/** Hằng số quy định kích thước vật lý tối thiểu của một phalet(inches) */
	private static final float MIN_PHALET_SIZE = 5.2f;
	/** Hằng số quy định kích thước vật lý tối thiểu của một tablet(inches) */
	private static final float MIN_TABLET_SIZE = 7.0f;

	/**
	 * Kích thước cơ bản của một button, tương ứng với cỡ của ngón tay.<br>
	 * Kích thước của các thành phần có tương tác với ngón tay sẽ dựa vào hằng
	 * số này để tính toán ra pixel
	 */
	public static final float INCHES_BUTTON_TABLET = 0.5F;
	public static final float INCHES_BUTTON_PHALET = 0.42F;
	public static final float INCHES_BUTTON_LARGE_PHONE = 0.37F;
	public static final float INCHES_BUTTON_NORMAL_PHONE = 0.33F;
	public static final float INCHES_BUTTON_SMALL_PHONE = 0.3F;
	/** Khoảng cách từ mỗi item đến lề: trái phải, trên, dưới (trong layout) */
	public static final float INCHES_MARGIN_TABLET = 0.04F;
	public static final float INCHES_MARGIN_PHONE = 0.033F;
	private static int margingHeight;
	private static int marginWidth;
	/** Khoảng cách giữa các item */
	public static final float INCHES_INNER_PADING_TABLET = 0.07F;
	public static final float INCHES_INNER_PADING_PHONE = 0.05F;

	/**
	 * số pixel trên inches tương ứng với tỉ lệ 1.0 của density
	 */
	public static final float DEFAULT_DENSITY_SCALE = 160f;

	/**
	 * Các kiểu kích thước màn hình
	 */
	public static final int PHONE_SMALL_TYPE = 1;
	public static final int PHONE_NORMAL_TYPE = 2;
	public static final int PHONE_LARGE_TYPE = 3;
	public static final int PHALET_TYPE = 4;
	public static final int TABLET_TYPE = 5;

	/**
	 * Reference to the main activity
	 */
	protected static RoyalMapActivity context;

	private static boolean isLandscape = false;
	private static int sizeType;

	public static float denstiy;
	private static float dpi;
	private static float xdpi;
	private static float ydpi;
	/**
	 * 
	 * Dimension of screen
	 */
	private static int screenWidth, screenHeight, smallerDimen;

	private static int paddingHeight;
	private static int paddingWidth;
	/** Chiều rộng của nút cơ sở */
	private static int pxButtonBaseWidth;
	/** Chiều cao của nút cơ sở */
	private static int pxButtonBaseHeight;
	/** Chiều cao của layout cơ sở */
	private static int pxLayoutBaseHeight;
	/** Cỡ chữ cơ sở */
	private static int spBase;
	/** Cỡ chữ cho version của ứng dụng */
	private static int vercodeSize;
	/** Cỡ chữ cho tên công ty trên giao diện lịch sử tracking */
	private static int comTrackingSize;
	/** Cỡ chữ cho thông tin phần  xem lại lịch sử tracking */
	private static int carInfoTrackingSize;

	/**
	 * Cỡ chữ nhỏ hơn, cho việc hiển thị địa chỉ 2 vị trí bắt đầu, và kết thúc
	 * tracking giá trị khác nhau vs các loại kích thước màn hình như spBase
	 */
	private static int text_Tracking_size;

	private static int contentHeight;

	/** Cỡ chữ trang home */
	private static int homeFontSize;

	/* Phần định nghĩa kích thước các kích thước của của các item trong setting */
	/** Kích thước toàn bộ dialog */
	private static int dialogWidth = 0;
	/** kích thước chuẩn của một item trên giao diện (đủ cho việc click) */
	private static int dialogItemHeight = 0;
	/** Kích thước header */
	private static int dialogHeaderHeight = 0;
	/** Kích thước footer */
	private static int dialogFooterHeight = 0;
	/** Font chữ của header */
	private static int dialogHeaderFontSize = 0;
	/** Font chữ của item */
	private static int dialogItemFontSize = 0;
	/** Kích thước chữ cho title listview */
	private static int titleSizeItemListView = 0;
	/** Kích thước chữ cho values listview */
	private static int valuesSizeItemListView = 0;
	/** Kích thức chữ trong các Button */
	private static int buttonFontSize = 0;   

	/* Phần định nghĩa kích thước các kích thước của của các item trong setting */
	/** kích thước font chữ trên item setting */
	private static int settingItemFontSize = 0;

	/* Phần định nghĩa các kích thước của của footer */
	/** kích thước font chữ trên item setting */
	private static int footerFontSize = 0;

	/**
	 * Constructor: set permission to private <br>
	 * Cannot create any instance
	 * 
	 * @param _gnav
	 */
	private ScreenUtils() {
	}

	/**
	 * Tính toàn bộ các thông số kích thước khi màn hình thay đổi hoặc khởi tạo
	 * ứng dụng
	 * 
	 * @param _gnav
	 */
	public static void initAll(Activity activity) {
		context = (RoyalMapActivity) activity;
		DisplayMetrics metrics = new DisplayMetrics();
		context.getWindowManager().getDefaultDisplay().getMetrics(metrics);
		// tính các chỉ số cơ bản để tính toán kích thước các thành phần khác
		screenHeight = metrics.heightPixels;
		screenWidth = metrics.widthPixels;
		denstiy = metrics.density;
		dpi = metrics.densityDpi;
		smallerDimen = Math.min(screenHeight, screenWidth);
		xdpi = metrics.xdpi;
		ydpi = metrics.xdpi;
		// float tmp = xdpi;
		// xdpi = ydpi;
		// ydpi = tmp;

		if (xdpi < dpi) {
			xdpi = dpi;
		}

		if (ydpi < dpi) {
			ydpi = dpi;
		}

		/*
		 * Phân loại màn hình: chia ra màn hình tablet và màn hình điện thoại,
		 * với mỗi loại màn hình, các giá trị kích thước sẽ phải tính theo tỉ lệ
		 * khác nhau
		 */
		sizeType = checkPhoneType();
		isLandscape = (screenWidth > screenHeight);

		/* Tính giá trị của từng kích thước cơ bản */
		// Trường hợp là một smart phone kích thước trung bình
		switch (sizeType) {
		case PHONE_SMALL_TYPE:
			paddingWidth = (int) (0.75 * dpi * INCHES_INNER_PADING_PHONE);
			paddingHeight = (int) (0.75 * dpi * INCHES_INNER_PADING_PHONE);
			pxButtonBaseWidth = (int) (0.75 * dpi * INCHES_BUTTON_SMALL_PHONE);
			pxButtonBaseHeight = (int) (0.75 * dpi * INCHES_BUTTON_SMALL_PHONE);
			marginWidth = (int) (0.75 * dpi * INCHES_MARGIN_PHONE);
			margingHeight = (int) (0.75 * dpi * INCHES_MARGIN_PHONE);
			spBase = 17;
			buttonFontSize = 17;
			text_Tracking_size = 11;
			homeFontSize = 20;
			dialogWidth = (int) (screenWidth * 0.8);
			break;

		case PHONE_NORMAL_TYPE:
			paddingWidth = (int) (dpi * INCHES_INNER_PADING_PHONE);
			paddingHeight = (int) (dpi * INCHES_INNER_PADING_PHONE);
			pxButtonBaseWidth = (int) (dpi * INCHES_BUTTON_NORMAL_PHONE);
			pxButtonBaseHeight = (int) (dpi * INCHES_BUTTON_NORMAL_PHONE);
			marginWidth = (int) (dpi * INCHES_MARGIN_PHONE);
			margingHeight = (int) (dpi * INCHES_MARGIN_PHONE);
			spBase = 19;
			buttonFontSize = 19;
			text_Tracking_size = 11;
			homeFontSize = 30;
			dialogWidth = (int) (screenWidth * 0.8);
			break;

		case PHONE_LARGE_TYPE:
			paddingWidth = (int) (dpi * INCHES_INNER_PADING_PHONE);
			paddingHeight = (int) (dpi * INCHES_INNER_PADING_PHONE);
			pxButtonBaseWidth = (int) (dpi * INCHES_BUTTON_LARGE_PHONE);
			pxButtonBaseHeight = (int) (dpi * INCHES_BUTTON_LARGE_PHONE);
			marginWidth = (int) (dpi * INCHES_MARGIN_PHONE);
			margingHeight = (int) (dpi * INCHES_MARGIN_PHONE);
			spBase = 22;
			buttonFontSize = 20;
			text_Tracking_size = 12;
			homeFontSize = 35;
			dialogWidth = (int) (screenWidth * 0.8);
			break;
		case PHALET_TYPE:
			paddingWidth = (int) (dpi * INCHES_INNER_PADING_TABLET);
			paddingHeight = (int) (dpi * INCHES_INNER_PADING_TABLET);
			pxButtonBaseWidth = (int) (dpi * INCHES_BUTTON_PHALET);
			pxButtonBaseHeight = (int) (dpi * INCHES_BUTTON_PHALET);
			marginWidth = (int) (dpi * INCHES_MARGIN_TABLET);
			margingHeight = (int) (dpi * INCHES_MARGIN_TABLET);
			spBase = 25;
			buttonFontSize = 20;
			text_Tracking_size = 12;
			homeFontSize = 42;
			break;
		case TABLET_TYPE:
			paddingWidth = (int) (dpi * INCHES_INNER_PADING_TABLET);
			paddingHeight = (int) (dpi * INCHES_INNER_PADING_TABLET);
			pxButtonBaseWidth = (int) (dpi * INCHES_BUTTON_TABLET);
			pxButtonBaseHeight = (int) (dpi * INCHES_BUTTON_TABLET);
			marginWidth = (int) (dpi * INCHES_MARGIN_TABLET);
			margingHeight = (int) (dpi * INCHES_MARGIN_TABLET);
			spBase = 33;
			buttonFontSize = 27;
			text_Tracking_size = 14;
			homeFontSize = 45;
			break;
		default:
			break;
		}

		/*
		 * if (sizeType == PHONE_TYPE) { paddingWidth = (int) (dpi *
		 * INCHES_INNER_PADING_PHONE); paddingHeight = (int) (ydpi *
		 * INCHES_INNER_PADING_PHONE); pxButtonBaseWidth = (int) (xdpi *
		 * INCHES_BUTTON_PHONE); pxButtonBaseHeight = (int) (ydpi *
		 * INCHES_BUTTON_PHONE); marginWidth = (int) (xdpi *
		 * INCHES_MARGIN_PHONE); margingHeight = (int) (ydpi *
		 * INCHES_MARGIN_PHONE); spBase = 21; dialogWidth = (int)(screenWidth *
		 * 0.8); } else // trường hợp là một tablet if (sizeType == TABLET_TYPE)
		 * { paddingWidth = (int) (xdpi * INCHES_INNER_PADING_TABLET);
		 * paddingHeight = (int) (ydpi * INCHES_INNER_PADING_TABLET);
		 * pxButtonBaseWidth = (int) (xdpi * INCHES_BUTTON_TABLET);
		 * pxButtonBaseHeight = (int) (ydpi * INCHES_BUTTON_TABLET); marginWidth
		 * = (int) (xdpi * INCHES_MARGIN_TABLET); margingHeight = (int) (ydpi *
		 * INCHES_MARGIN_TABLET); spBase = 30; } else // trường hợp là các thiết
		 * bị quá nhỏ { paddingWidth = (int) (0.75 * xdpi *
		 * INCHES_INNER_PADING_PHONE); paddingHeight = (int) (0.75 * ydpi *
		 * INCHES_INNER_PADING_PHONE); pxButtonBaseWidth = (int) (0.75 * xdpi *
		 * INCHES_BUTTON_PHONE); pxButtonBaseHeight = (int) (0.75 * ydpi *
		 * INCHES_BUTTON_PHONE); marginWidth = (int) (0.75 * xdpi *
		 * INCHES_MARGIN_PHONE); margingHeight = (int) (0.75 * ydpi *
		 * INCHES_MARGIN_PHONE); spBase = 17; dialogWidth = (int)(screenWidth *
		 * 0.8); }
		 */

		// Chiều cao của một layout bằng 2 lần căn lề cộng với một nút
		pxLayoutBaseHeight = paddingHeight * 2 + pxButtonBaseHeight;

		//chiều cao của thanh status bar và navigation bar
		int barHeight = Utils.getStatusBarHeight() + Utils.getNavigationBarHeight();
		// tính chiều cao của nội dung
		contentHeight = (int) (((screenHeight -barHeight) * 9.5) / 10.5);

		// Tính kích thước các thành phần dialog
		calcuDialogDimens();
		// Tính kích thước trên setting
		calcuSettingDimens();
		// Tính kích thước trên footer
		calcuFooterDimens();
	}

	/**
	 * Kiểm tra xem kích thước màn hình ứng với điện thoại hay tablet
	 */
	private static int checkPhoneType() {
		int ret = 0;
		// tính chiều dài, chiều rộng màn hình ra inch
		float inH = screenHeight / ydpi;
		float inW = screenWidth / xdpi;
		// float inH = screenHeight / dpi;
		// float inW = screenWidth / dpi;
		// kích thước màn hình là kích thước đường chéo
		float finalInches = (float) Math.sqrt(inH * inH + inW * inW);
		if (finalInches > MIN_TABLET_SIZE) {
			ret = TABLET_TYPE;
		} else if (finalInches > MIN_PHALET_SIZE) {
			ret = PHALET_TYPE;
		} else if (finalInches > MIN_LARGE_PHONE_SIZE) {
			ret = PHONE_LARGE_TYPE;
		} else if (finalInches > MIN_NORMAL_PHONE_SIZE) {
			ret = PHONE_NORMAL_TYPE;
		} else {
			ret = PHONE_SMALL_TYPE;
		}
		/*
		 * Log.e(TAG, "inH = " + inH + " - inW = " + inW + " - finalInches = " +
		 * finalInches + " - dpi: x = " + xdpi + " - y = " + ydpi +
		 * " - phone type: " + ret + " - dpi = " + dpi + " , denstiy = " +
		 * denstiy);
		 */
		return ret;
	}

	private static void calcuDialogDimens() {
		/* Kích thước chuẩn của một item trên giao diện (đủ cho việc click) */
		dialogItemHeight = pxButtonBaseHeight;
		/* Kích thước header */
		dialogHeaderHeight = (int) (pxButtonBaseHeight * 1.3f);
		/* Kích thước footer */
		dialogFooterHeight = (int) (pxButtonBaseHeight * 0.56f);

		dialogHeaderFontSize = (int) (spBase * 1.3f);
		/* Font chữ của item */
		dialogItemFontSize = spBase;

		/* Font chữ của title item listview */
		titleSizeItemListView = (int) (spBase * 0.8f);
		/* Size chữ cho thông tin version của ứng dụng phần help*/
		vercodeSize = (int) (spBase * 0.8f);
		/*Size chữ cho thông tin công ty tại phần tracking */
		comTrackingSize = (int)(spBase * 0.9f);
		/*Size chữ cho thông tin số hiệu xe... tracking */
		carInfoTrackingSize = (int) (spBase * 0.7f);
		
		/* Font chữ của values item listview */
		valuesSizeItemListView = (int) (spBase * 0.7f);
	}

	private static void calcuSettingDimens() {
		settingItemFontSize = spBase;
		// TODO
	}

	private static void calcuFooterDimens() {
		footerFontSize = (int) (spBase * 1.2f);
		// TODO
	}

	/**
	 * Kiểm tra dạng màn hình: ngang, dọc hay vuông
	 * 
	 * @return
	 */
	public static int screenOrientation() {
		int orientation = context.getResources().getConfiguration().orientation;

		// if undefined
		if (orientation == Configuration.ORIENTATION_UNDEFINED) {
			final Display display = context.getWindowManager()
					.getDefaultDisplay();

			if (display.getWidth() == display.getHeight()) {
				orientation = Configuration.ORIENTATION_SQUARE;
			} else {
				if (display.getWidth() < display.getHeight()) {
					orientation = Configuration.ORIENTATION_PORTRAIT;
				} else {
					orientation = Configuration.ORIENTATION_LANDSCAPE;
				}
			}
		}
		return orientation;
	}

	/**
	 * @return
	 */
	public static int getTypeOfSize() {
		return sizeType;
	}

	public static boolean isTablet() {
		return sizeType == TABLET_TYPE;
	}

	public static int getScreenWidth() {
		return screenWidth;
	}

	public static int getScreenHeight() {
		return screenHeight;
	}

	public static boolean isLandscape() {
		return isLandscape;
	}

	public static float getDenstiy() {
		return denstiy;
	}

	public static int getContentHeight() {
		return contentHeight;
	}

	/**
	 * Trả về độ rộng của một button bình thường (vừa ngón tay)
	 * 
	 * @return
	 */
	public static int getBaseButtonPixelWidth() {
		return pxButtonBaseWidth;
	}

	/**
	 * Trả về độ cao của một button bình thường (vừa ngón tay)
	 * 
	 * @return
	 */
	public static int getBaseButtonPixelHeith() {
		return pxButtonBaseHeight;
	}

	/**
	 * Trả về khoảng cách từ mỗi thành phần đến lề trên hoặc lề dưới
	 * 
	 * @return
	 */
	public static int getBaseMarginHeith() {
		return margingHeight;
	}

	/**
	 * Trả về khoảng cách từ mỗi thành phần đến lề trái hoặc lề phải
	 * 
	 * @return
	 */
	public static int getBaseMarginWidth() {
		return marginWidth;
	}

	/**
	 * Trả về khoảng cách theo chiều ngang giữa các nút
	 * 
	 * @return
	 */
	public static int getBasePaddingHeith() {
		return paddingHeight;
	}

	/**
	 * Trả về khoảng cách theo chiều dọc giữa các nút
	 * 
	 * @return
	 */
	public static int getBasePaddingWidth() {
		return paddingWidth;
	}

	/**
	 * Trả về kích thước font cơ bản
	 * 
	 * @return
	 */
	public static int getBaseFontSize() {
		return spBase;
	}
	/**
	 * Trả về size cho thông tin ứng dụng
	 */
	public static int getVercodeFontSize() {
		return vercodeSize;
	}
	/**
	 * Trả về size cho thông tin công ty, tracking
	 * @return
	 */
	public static int getComTrackingSize() {
		return comTrackingSize;
	}
	/**
	 * Trả về size cho thông tin phần tracking
	 */
	public static int getCarInfoTrackingSize() {
		return carInfoTrackingSize;
	}
	/**
	 * trả về kích thước chữ trong Button
	 */
	public static int getButtonFontSize(){
		return buttonFontSize;
	}

	/**
	 * Trả về kích thước font nhỏ hơn font cơ bản
	 */
	public static int getText_trackingSize() {
		return text_Tracking_size;
	}

	/**
	 * Trả về kích thước font cơ bản
	 * 
	 * @return
	 */
	public static int getHomeFontSize() {
		return homeFontSize;
	}

	public static int getDialogWidth() {
		return dialogWidth;
	}

	public static int getDialogItemHeight() {
		return dialogItemHeight;
	}

	public static int getDialogHeaderHeight() {
		return dialogHeaderHeight;
	}

	public static int getDialogFooterHeight() {
		return dialogFooterHeight;
	}

	public static int getSettingItemFontSize() {
		return settingItemFontSize;
	}

	public static int getFooterFontSize() {
		return footerFontSize;
	}

	public static int getDialogHeaderFontSize() {
		return dialogHeaderFontSize;
	}

	public static int getDialogItemFontSize() {
		return dialogItemFontSize;
	}

	public static int getTitleSizeItemListView() {
		return titleSizeItemListView;
	}
	
	public static int getValuesSizeItemListView() {
		return valuesSizeItemListView;
	}

	// Xem xét lại các phương thức , thừa quá nhiều

}
